package cn.itsource.pethome.org.controller;


import cn.itsource.pethome.base.domain.BaseQuery;
import cn.itsource.pethome.base.domain.CustomeParam;
import cn.itsource.pethome.base.domain.PageResult;
import cn.itsource.pethome.org.domain.Department;
import cn.itsource.pethome.org.domain.Employee;
import cn.itsource.pethome.org.service.DepartmentService;
import cn.itsource.pethome.org.service.EmployeeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * @Api 作用在类上 value 里面填写的是当前类的文档描述
 */
@Api(value = "部门管理的接口文档",description = "部门管理的接口文档")
@RestController
@RequestMapping("/dept")
@Slf4j
public class DepartmentController {
    @Autowired
    DepartmentService departMentService;
    @Autowired
    EmployeeService employeeService;

    /**
     * @ApiOperation 作用在方法上 这个注解里的value 是标注当前方法的作用
     * @ApiParam 作用在参数上 value 是描述当前参数 required
     * @param id
     * @return
     */
    @ApiOperation(value = "查询单个部门数据", notes = "查询单个部门数据")
//    @RequestMapping("/findOne")
    /**
     *   @GetMapping  获取 = @RequestMapping
     *     @PostMapping 添加
     *     @PutMapping 修改
     *     @DeleteMapping 删除
     *     @PatchMapping 批量
     *     @PathVariable :这个注解是用来获取路径上的参数
     */
    @GetMapping("/{id}")
    public Department findOne(@ApiParam(value = "部门id" , required=true )@PathVariable(name = "id") Long id){
        return departMentService.findOne( id);
    }
    //删除
    //查询所有
    //修改
    //新增

    /**
     * 新增接口
     * @RequestBody : 将接收的json参数转换为我们的java对象
     *@RequestBody
     * @param department
     */
    @PostMapping("/add")
    public void insert(@RequestBody @Valid Department department){
        departMentService.insert(department);
    }
    @PostMapping("/update")
    public void update(@RequestBody Department department){
        departMentService.update(department);
    }

    /**
     * 分页条件查询
     * @param query
     * 前端的数据  {keyword:"",page:1}
     * 访问的地址:localhost:80/dept/findPage
     * 返回的数据: {total:10,dept:[]}
     */
    @PostMapping("/findPage")
    public PageResult<Department> findPage(@RequestBody BaseQuery query){
        PageResult<Department> page = departMentService.findPage(query);
        return page;
    }

    /**
     * 三种方式 map JSONObject java对象
     * @param
     * @RequestBody:就是将前端传过来的json序列化成我们的java对象
     * {"id":1}
     */
    @PostMapping("/delete")
    public void delete(@CustomeParam Long id){
        //不要做做物理删除,做逻辑删除
        log.info("获取到的删除的id:{}",id);
        departMentService.delete(id);
    }

    /**
     * dept/deleteBatch",ids = [1,2,3]
     */
    //批量删除
    @PostMapping("/deleteBatch")
    public void deleteBatch(@RequestBody List<Long> ids){
        //不要做做物理删除,做逻辑删除
        log.info("获取到的删除的ids:{}",ids);
        departMentService.deleteBatch(ids);
    }

    /**
     * 获取所有的员工信息
     * url:/dept/findEmpls
     */
    @GetMapping("/findEmpls")
    public  List<Employee>  findEmpls(){
        //不要做做物理删除,做逻辑删除
        return  employeeService.findAll();
    }
    /**
     * /dept/tree
     * 这里是获取部门的树形结构list
     */
    @GetMapping("/tree")
    public   List<Department>  findTree(){
        //查询部门树型结构
        List<Department> trees = departMentService.findTree();
        log.info("当前获取到的tree:{}",trees);
        return  trees;
    }


    /**
     * 1.在路径上传递参数:一般就是只有一个id作为参数时使用
     * 前端: 请求 url: dept/delete/1
     * 后端: 首先接收请求的方式一定要与前端对应,然后获取参数的方式 :使用@PathVariable 去从路径上拿到参数
     *缺点:就是一定要与前端协调
     */

    /**
     * 项目一:
     * 2.常见的就是使用get 或者post
     * 前端: get请求 url: dept/delete?id=1
     *        post请求: url:dept/delete  参数放在请求体中,并且请求体设置一个conten-type : application/json
     * 后端: @requestMapper   参数:也不需要打注解
     *
     *缺点:就是如果后期请求过多,springmvc它识别不出来,你的请求到底是post 还是get
     */
    /**
     * 常规的写法:
     * 前端: get请求 url: dept/delete?id=1
 *      *        post请求: url:dept/delete  参数放在请求体中,并且请求体设置一个conten-type : application/json
     *  后端:get请求,对应的就是@GetMapper 参数:默认就有@RequestParam 不用打注解
     *  post请求,@postMapper   参数上还需要打一个注解@RequestBody
     */
}
